package br.uece.ativcomplementares.beans;

import java.io.IOException;
import java.io.Serializable;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

import org.primefaces.event.FileUploadEvent;

import br.uece.ativcomplementares.business.AtividadeAlunoBO;
import br.uece.ativcomplementares.business.AtividadeComplementarBO;
import br.uece.ativcomplementares.dao.AtividadeAlunoDao;
import br.uece.ativcomplementares.dao.AtividadeComplementarDao;
import br.uece.ativcomplementares.entity.Aluno;
import br.uece.ativcomplementares.entity.AtividadeAluno;
import br.uece.ativcomplementares.entity.Certificado;
import br.uece.ativcomplementares.entity.atividades.Ensino;
import br.uece.ativcomplementares.exceptions.BusinessException;
import br.uece.ativcomplementares.utils.CertificadoUtils;

public class EnsinoBean extends AbstractBean implements Serializable {

	private static final long serialVersionUID = -8541357128043522063L;
	
	private Ensino ensino;
	
	private boolean atualizando;
	
	private Long idEnsino;
	
	// Dependências
	private AtividadeComplementarBO ativComplementarBO;
	private AtividadeAlunoBO atividadeAlunoBO;	
	private Aluno aluno;
	private long codAtividadeComplementar;
	private CertificadoUtils certificadoUtils;
	
	
	public EnsinoBean() {
		ativComplementarBO = new AtividadeComplementarBO(new AtividadeComplementarDao());
		atividadeAlunoBO = new AtividadeAlunoBO(new AtividadeAlunoDao());
		ensino = new Ensino();
	}
	
	@PostConstruct
	public void init() {
		clean();
		certificadoUtils = new CertificadoUtils(aluno);
	}
	
    @PreDestroy
    public void destroy() {
    	if (ensino.getCertificados() != null 
    			&& !ensino.getCertificados().isEmpty()) {
    		
    		for (Certificado certificado : ensino.getCertificados()) {
    			certificadoUtils.removerCertificadoDaTemp(certificado);
			}
    	}
    }

	public void load() {
		ensino.setAtividade(ativComplementarBO.buscaPorCodAtividade(codAtividadeComplementar));
		
		if (idEnsino != null) {
			AtividadeAluno atividadeAluno = atividadeAlunoBO.buscaPorId((Long) idEnsino);
			
			if (atividadeAluno != null) {
				if (aluno != null 
						&& (!atividadeAluno.getAluno().equals(aluno) || !(atividadeAluno instanceof Ensino))) {
					addErrorMessage("Atividade pertence a outro aluno.");
				} else {
					ensino = (Ensino) atividadeAluno;
					atualizando = true;
				}
			}
		} 
	}
	
	public void clean() {
		ensino = new Ensino();
		ensino.setAluno(aluno);		
		atualizando = false;
	}
	
	public void incluir() {
		atividadeAlunoBO.incluir(ensino);
		addInfoMessage("atividade_aluno.inclusao");
		clean();
	}
	
	public void atualizar() {
		atividadeAlunoBO.atualizar(ensino);
		addInfoMessage("atividade_aluno.alteracao");
	}
	
	public void excluir() {
		atividadeAlunoBO.excluir(ensino);
		addInfoMessage("atividade_aluno.exclusao");		
		clean();
	}
	
	public void handleFileUpload(FileUploadEvent event) throws IOException {
		try {
			certificadoUtils.handleFileUpload(ensino, event);
		} catch (BusinessException e) {
			addErrorMessage(e.getMessage());
		}
	}
	
	public void exibirCertificado(Certificado certificado) throws Exception {
		certificadoUtils.downloadCertificado(certificado);
	}
	
	public void removerCertificado(Certificado certificado) {
		ensino.getCertificados().remove(certificado);
	}
	
	public Ensino getEnsino() {
		return ensino;
	}

	public void setAluno(Aluno aluno) {
		this.aluno = aluno;
	}

	public boolean isAtualizando() {
		return atualizando;
	}
	
	public long getCodAtividadeComplementar() {
		return codAtividadeComplementar;
	}

	public void setCodAtividadeComplementar(long codAtividadeComplementar) {
		this.codAtividadeComplementar = codAtividadeComplementar;
	}
	
	public Long getIdEnsino() {
		return idEnsino;
	}

	public void setIdEnsino(Long idEnsino) {
		this.idEnsino = idEnsino;
	}

}
